#!/bin/bash
########################################################################
####  Script Name: sm-lib-package-removal
####  version: 1.4.2
####  Date: 2011-02-10

####  Copyright (C) Harald Hope 2005-2011
####  This program is free software; you can redistribute it and/or modify it under
####  the terms of the GNU General Public License as published by the Free Software
####  Foundation; either version 2 of the License, or (at your option) any later version.

####  This program is distributed in the hope that it will be useful, but WITHOUT
####  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
####  FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

####  Get the full text of the GPL here:
####  http://www.gnu.org/licenses/old-licenses/gpl-2.0.html

####  Script Author: Harald Hope
####  This is a library file for smxi and cannot be run independently

####  Script URL: http://smxi.org/sm/sm-lib-package-removal
####  Script SVN: http://code.google.com/p/smxi
####  Script Home page: http://techpatterns.com/forums/about736.html
########################################################################

########################################################################
####  FUNCTIONS
########################################################################

###---------------------------------------------------------------------
### package removal stuff
###---------------------------------------------------------------------

package_removal()
{
	eval $LOGME
	local repeat='' response='' completed='' opt='' options='' kickThem='' kickItems=''
	local options="bluetooth captive dmraid-mdadm-lvm german-components-de gnomemeetings isdn klaptopdaemon koffice libreoffice-all openoffice.org-all skype splashy squid vdr wifi wvdial xawtv remove-chosen back-to-main-menu"
	local removeCount=$( echo $options | awk '{print NF-1}' )

	print_lib_info $LIB_PACKAGE_REMOVAL
	echo $MLINE
	echo "${S}Please enter each item/group you want to remove completely."
	echo "Simply enter the number, hit enter, then enter the next number,"
	echo "for as many as you want. Once you are done, select ${C}remove-chosen${S}"
	echo "and the selected items will all be removed one by one. You will be asked to"
	echo "confirm each item's removal when it comes up, so you can change your mind."
	echo $LINE
	echo "${S}Note: german-components-de will look for and remove all -de type packages on the system."
	echo "Note: wifi can remove ALL wifi firmware, and associated wifi components."
	echo "${M}This is best for machines that will never use wifi, or for laptops where you"
	echo "want to remove unneeded wifi components. Please read the items carefully before answering ${C}y${M}."
	echo $LINE

	select opt in $options
	do
		case $opt in
			bluetooth|captive|dmraid-mdadm-lvm|german-components-de|gnomemeetings|isdn|klaptopdaemon|koffice|libreoffice-all|openoffice.org-all|pppoe|skype|splashy|squid|vdr|wifi|wvdial|xawtv)
				kickItems="$kickItems $opt"
				echo "${S}Selected items to remove:${C}$kickItems"
				echo "${S}Enter another item's number to remove more packages, or enter ${C}$removeCount${S} to remove items.${N}"
				kickThem='false'
				;;
			remove-chosen)
				completed='true'
				kickThem='true'
				;;
			back-to-main-menu)
				completed='true'
				kickThem='false'
				repeat='false'
				;;
			*)
				completed='true'
				repeat='true'
				print_error opt
				;;
		esac
		if [ "$completed" == 'true' ];then
			break
		fi
	done

	# this is just in case user hits remove-chosen without having entered an item
	if [ "$kickThem" == 'true' ];then
		if [ -n "$kickItems" ];then
			confirm_kick_items "$kickItems"
		else
			echo "${E}No items were selected! Let's try that again!${N}"
			package_removal
		fi
	fi
	eval $LOGME
	if [ "$repeat" == 'true' ];then
		package_removal
	fi
}
# args: $1 - kickItems
confirm_kick_items()
{
	eval $LOGUS

	local opt='' options='' kickItems="$1"

	echo $LINE
	echo "${S}These are your current selections. You will be asked one by one to"
	echo "remove the packages/groups that are installed on your system, and you will"
	echo "be alerted which are not installed as well as the remover runs."
	echo "${C}$kickItems"
	echo -e "${Q}Are you sure you want to completely remove these?"
	echo $LINE
	echo -e $SLE
	echo $LINE
	options="yes-remove-all no-start-over"

	select opt in $options
	do
		log_function_data "opt selected: $opt"
		case $opt in
			yes-remove-all)
				remove_kick_packages "$kickItems"
				;;
			no-start-over)
				echo "${S}Ok, let's start over again.${N}"
				package_removal
				;;
			*)
				print_error opt
				repeat='true'
				;;
		esac
		break
	done

	eval $LOGUE
	if [ "$repeat" == 'true' ];then
		confirm_kick_items "$kickItems"
	fi
}

# args: $1 - which group type to remove
remove_kick_packages()
{
	eval $LOGUS
	local kickIt='' kickItems="$1" packages='' packageCount='' plural=''

	for kickIt in $kickItems
	do
		# I don't know why these exceptions are here, leaving them for now
		# but I don't think they are necessary any longer
		case $kickIt in
			bluetooth)
				packages="$( package_tester '(bluetooth|bluez)' 'wild-full' )"
				;;
			captive)
				packages="$( package_tester '(captive|captive-lufs|captive-install|gnome-vfs-httpcaptive|ntfsprogs-gnomevfs)' )"
				;;
			dmraid-mdadm-lvm)
				packages="$( package_tester '(dmraid|mdadm|lvm|lvm2|lvm-common)' )"
				;;
			german-components-de)
				packages="$( package_tester '([.a-z0-9-]*-de(-[.a-z0-9-]*)*)' )"
				;;
			libreoffice-all)
				packages="$( package_tester '(libreoffice|python-uno)' 'wild-full' )"
				;;
			openoffice.org-all)
				packages="$( package_tester '(openoffice.org|python-uno)' 'wild-full' )"
				;;
			vdr)
				packages="$( package_tester '(*vdr[:space:]|vdr-|xvdr)' 'wild' ) $( package_tester 'vdr' )"
				;;
			wifi)
				#note: pulling bcm, too loose
				packages="$( package_tester '(b43|ipw[1-9]|madwifi|ndiswrapper|wifi|rt25|rt61|wlan-|at76|at76|zd12)' 'wild-full' )"
				;;
			*)
				packages=$( package_tester "$kickIt" 'wild-full' )
				;;
		esac
		# trim spaces from ends and null content
		packages=$( sed -r 's/(^[[:space:]]|[[:space:]]$)//g' <<< "$packages" )
		packageCount=$( wc -w <<< $packages )
		if [ "$packageCount" -gt 1 ];then
			plural='s'
		else
			plural=''
		fi
		echo $LINE
		if [ -n "$packages" ];then
			echo "${S}Removing ${C}$kickIt${S} package$plural now...${N}"
			package_remover "$packages" 'purge' 'group'
		else
			echo "${M}No ${C}$kickIt${M} package installed on your system...${N}"
			sleep 1.3
		fi
	done
	echo $LINE
	echo "${S}Finished removing components.${N}"
	print_hec
	eval $LOGUE
}

# package_removal

###**EOF**###